package com.levi.distributedlimiter.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * guava   单机版限流
 * 平滑输出，允许突发流量，相当于透支
 */
@RestController
@Slf4j
public class LimiterController {
    //每秒生成10个令牌
    private RateLimiter rateLimiter = RateLimiter.create(10);

    @GetMapping("guava")
    public void guava() {

        //平滑输出，允许突发流量，相当于透支
//        log.info("{}",rateLimiter.acquire(3));
//        log.info("{}",rateLimiter.acquire());
//        log.info("{}",rateLimiter.acquire());
//        log.info("{}",rateLimiter.acquire());

        //尝试获取令牌，获取到令牌了返回true，没有获取到令牌返回false
        boolean b = rateLimiter.tryAcquire();
        if (b) {
            //抢到了令牌可以执行相应的操作
            log.info("恭喜你抢到了令牌");
        }else {
            log.info("不好意思，没有抢到令牌");
        }
    }

    @GetMapping("sentinel")
    @SentinelResource(value = "sentinel",fallback = "",blockHandler = "")
    public String sentinel() {
//        log.info("sentinel limiter  ....");
        return "Sentinel  limiter";
    }

    /**
     * 处理控制台异常的方法
     * 比如 限流，熔断，降级
     */
    public void blockHandlerMethod() {
        log.info("你被限流了");
    }

    /**
     * 处理业务异常  RuntimeException
     *
     * 服务之间调用的话要与feign联合使用，实现接口写熔断降级的方法
     */
    public void fallbackMethod() {
        log.info("处理业务异常的方法");
    }
}
